home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 331 / gemfsc14 / aessrc14 / aesutob3.s < prev    next >
Text File  |  1989-08-26  |  7KB  |  165 lines

  1.  
  2. ;*========================================================================
  3. ;*
  4. ;* AESFAST Public Domain GEM bindings.
  5. ;*
  6. ;*  04/06/89 v1.2
  7. ;*           Added line to objcl_calc() to mask off the upper byte of
  8. ;*           of the object type before going into the 'switch' block.
  9. ;*           This insures that extended object types won't screw up the
  10. ;*           clipping calcs.
  11. ;*  08/28/89 v1.3
  12. ;*           Removed objclg_adjust and objclv_adjust from this module.
  13. ;*           These routines have been re-classified as rectangle calcs,
  14. ;*           and are now found in AESUTRC5.S as rc_gadjust and rc_vadjust.
  15. ;*           Also, the docs for v1.3 utils state that objcl_calc is being
  16. ;*           phased out.
  17. ;*
  18. ;*========================================================================
  19.  
  20. ;*************************************************************************
  21. ;*
  22. ;* AESUTOB3.S - Object-related utilities 3 of n.
  23. ;*  Non-standard utility functions.
  24. ;*
  25. ;*************************************************************************
  26.          
  27.           .extern   _objc_offset        ; 
  28.           .include  "gemfast.sh"        ; Pull in header file.
  29.  
  30. ;-------------------------------------------------------------------------
  31. ; objcl_calc - Return clipping rectangle(s) (x,y,w,h & x1,y1,x2,y2) 
  32. ;              from object's coordinates. 
  33. ;
  34. ;  This routine simultaneously calculates the GRECT and VRECT clipping
  35. ;  rectangles that describe an object.   
  36. ;
  37. ;  If object has outside borders or is OUTLINED and/or SHADOWED,
  38. ;  clipping sizes are calc'd accordingly.
  39. ;
  40. ;  (This routine started out short and gracefull...)
  41. ;
  42. ;   void objcl_calc (tree, object, {&grect|NULL},{&vrect|NULL});
  43. ;-------------------------------------------------------------------------
  44.  
  45. _objcl_calc::
  46.  
  47.           .cargs    #-20,.off_x,.off_y,.gx,.gy,.gw,.gh,.vx1,.vy1,.vx2,.vy2
  48.           .cargs    #8,.ptree.l,.obj.w,.pgrect.l,.pvrect.l
  49.  
  50.           link      a6,#-20
  51.           move.l    a2,-(sp)            ; This keeps Laser C happy.
  52.           
  53.           pea       .off_y(a6)          ; First get the screen offsets
  54.           pea       .off_x(a6)          ; of the object via objc_offset.
  55.           move.w    .obj(a6),-(sp)
  56.           move.l    .ptree(a6),-(sp)
  57.           jsr       _objc_offset
  58.           lea       14(sp),sp
  59.  
  60.           move.l    .ptree(a6),a0       ; build a pointer to the object.
  61.           move.w    .obj(a6),d0
  62.           muls      #OBJ_SIZ,d0
  63.           add.l     d0,a0
  64.  
  65.           moveq.l   #0,d1               ; Init adjust val for all sides and
  66.           moveq.l   #0,d2               ; extra adjust for right & bottom.
  67.  
  68.           move.w    ob_type(a0),d0      ; switch (ob_type) 
  69.           and.w     #$00FF,d0           ; mask out any extended object type
  70.           cmp.w     #G_BOX,d0
  71.           beq.s     .box
  72.           cmp.w     #G_IBOX,d0
  73.           beq.s     .box
  74.           cmp.w     #G_BOXCHAR,d0
  75.           beq.s     .box
  76.           cmp.w     #G_BOXTEXT,d0
  77.           beq.s     .text
  78.           cmp.w     #G_FBOXTEXT,d0      ; If the object is not one of these
  79.           beq.s     .text               ; types, it won't have any outer
  80.           cmp.w     #G_BUTTON,d0        ; width, but could still be 
  81.           bne.s     .outline            ; OUTLINED or SHADOWED.
  82. .button:
  83.           subq.w    #1,d1                         ; Any button has an outer
  84.           btst.b    #BEXIT,ob_flags+1(a0)          ; width of at least 1.
  85.           beq.s     .outline                      ; An EXIT button has a
  86.           subq.w    #1,d1                         ; width of 2, and 
  87.           btst.b    #BDEFAULT,ob_flags+1(a0)       ; a DEFAULT EXIT button
  88.           beq.s     .outline                      ; has a width of 3.
  89.           subq.w    #1,d1
  90.           bra.s     .outline
  91. .box:
  92.           move.b    ob_spec+1(a0),d1              ; A box's width is
  93.           ext.w     d1                            ; contained in ob_spec,
  94.           bra.s     .outline                      ; in byte $00nn0000.
  95. .text:
  96.           move.l    ob_spec(a0),a1                ; Width of a text object
  97.           move.w    te_thickness(a1),d1           ; is in the TEDINFO.
  98. .outline:
  99.           move.w    d1,d0                         ; Save true width for
  100.           btst.b    #BOUTLINED,ob_state+1(a0)      ; shadow calcs. If object
  101.           beq.s     .not_outlined                 ; is outlined, the new
  102.           cmp.w     #-3,d1                        ; outer width is -3 unless
  103.           blt.s     .not_outlined                 ; the true width was
  104.           moveq.l   #-3,d1                        ; already bigger.
  105. .not_outlined:
  106.           btst.b    #BSHADOWED,ob_state+1(a0)      ; If object is shadowed
  107.           beq.s     .notshadowed                  ; we need to adjust right
  108.           tst.w     d0                            ; and bottom sides. Rule
  109.           bpl.s     .notnegshadow                 ; for shadow's width is
  110.           neg.w     d0                            ; that the shadow is twice
  111. .notnegshadow:                                    ; the absolute value of
  112.           move.w    d0,d2                         ; the object's width (not
  113.           add.w     d2,d2                         ; counting OUTLINE width).
  114. .notshadowed:
  115.           tst.w     d1                            ; Check accumulated width.
  116.           bmi.s     .outsidewidth                 ; If positive, the object
  117.           moveq.l   #0,d1                         ; has inner width, ignore.
  118. .outsidewidth:
  119.           lea       .gx(a6),a1          ; Get ready to do output.  Get
  120.           move.l    .pgrect(a6),d0      ; pointer to user's GRECT, if null
  121.           beq.s     .nogrect            ; build GRECT into dummy area.
  122.           move.l    d0,a1
  123. .nogrect:
  124.           lea       .vx1(a6),a2         ; Get pointer to user's VRECT,
  125.           move.l    .pvrect(a6),d0      ; if null, build VRECT into dummy
  126.           beq.s     .novrect            ; area.
  127.           move.l    d0,a2
  128. .novrect:
  129.           move.l    .off_x(a6),d0       ; Load the screen x/y we got earlier,
  130.           move.l    d0,(a1)             ; store it all over the place...
  131.           move.l    d0,(a2)
  132.           move.l    d0,4(a2)
  133.           move.w    ob_w(a0),d0
  134.           move.w    d0,4(a1)
  135.           add.w     d0,4(a2)
  136.           move.w    ob_h(a0),d0
  137.           move.w    d0,6(a1)
  138.           add.w     d0,6(a2)
  139.  
  140.           subq.w    #1,d1               ; Subtract one from calc'd size
  141.           add.w     d1,(a1)             ; for clipping, add sizes to
  142.           add.w     d1,(a2)             ; x/y/w/h values in rectangles...
  143.           add.w     d1,2(a1)
  144.           add.w     d1,2(a2)
  145.           addq.w    #1,d1               ; Add the one back in.
  146.           neg.w     d1
  147.           add.w     d1,4(a2)
  148.           add.w     d1,6(a2)
  149.           lsl.w     #1,d1
  150.           addq.w    #1,d1
  151.           add.w     d1,4(a1)
  152.           add.w     d1,6(a1)
  153.  
  154.           add.w     d2,4(a1)            ; Add in shadow sizes to right
  155.           add.w     d2,6(a1)            ; and bottom numbers.
  156.           add.w     d2,4(a2)
  157.           add.w     d2,6(a2)
  158.           
  159.           move.l    (sp)+,a2            ; Restore Laser C register.
  160.           unlk      a6
  161.           rts
  162.  
  163. ;         end of code
  164.  
  165.